package com.wsoft.core.utils;

import com.wsoft.excel.config.ExcelRangeConfig;
import com.wsoft.excel.config.ExcelStyleConfig;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * @Author z001
 * @Date 2024/11/11 08:29
 */
public class FormExcelUtil {

    public static void exportFormData(HttpServletResponse response,
                                      String fileName,
                                      String sheetName,
                                      List<List<String>> headList,
                                      List<List<String>> dataList) throws IOException {
        //导出数据
        ExcelDataUtil.exportSingletonSheet(response, null, fileName, sheetName, headList, dataList, null, null, null, null);
    }


    public static void exportFormData(HttpServletResponse response,
                                      String fileName,
                                      List<String> sheetName,
                                      List<List<List<String>>> headList,
                                      List<List<List<String>>> dataList) throws IOException {
        //导出数据
        ExcelDataUtil.exportMultiSheet(response, null, fileName, sheetName, headList, dataList, null, null, null, null);
    }

    //################################# 导出 ########################################

    /**
     * 导出 模板 ==> 直接导出
     *
     * @param response
     * @param fileName         文件名
     * @param design           设计表id
     * @param parentId         父节点id (只导出子表时传,其余null)
     * @param headStyle        表头样式 使用默认样式传null
     * @param waterMarkContent 水印内容 不使用水印 传null
     * @throws IOException
     */
    public static void exportFormTemplate(HttpServletResponse response,
                                          String fileName,
                                          Long designId,
                                          Long parentId,
                                          ExcelStyleConfig headStyle,
                                          String waterMarkContent) throws IOException {
        //导出模板
        ExcelDataUtil.exportFormTemplateResponse(response, fileName, designId, parentId, headStyle, null, waterMarkContent);
    }

    /**
     * 导出 模板 ==> 返回输出流
     *
     * @param design           设计表id
     * @param parentId         父节点id (只导出子表时传,其余null)
     * @param headStyle        表头样式 使用默认样式传null
     * @param waterMarkContent 水印内容 不使用水印 传null
     * @throws IOException
     */
    public static ByteArrayOutputStream exportFormTemplate(String fileName,
                                                           Long designId,
                                                           Long parentId,
                                                           ExcelStyleConfig headStyle,
                                                           String waterMarkContent) throws IOException {
        // 创建 ByteArrayOutputStream
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        //导出模板
        ExcelDataUtil.exportFormTemplateStream(outputStream, fileName, designId, parentId, headStyle, null, waterMarkContent);
        return outputStream;
    }


    /**
     * 直接导出 数据 ==> 单表
     *
     * @param response
     * @param fileName         导出文件名
     * @param sheetName        导出sheet名
     * @param headList         表头
     * @param dataList         数据
     * @param headStyle        表头样式
     * @param contentStyle     内容样式
     * @param rangeConfigList  合并单元格样式
     * @param waterMarkContent 水印内容
     * @throws IOException
     */
    public static void exportFormData(HttpServletResponse response,
                                      String fileName,
                                      String sheetName,
                                      List<List<String>> headList,
                                      List<List<String>> dataList,
                                      ExcelStyleConfig headStyle,
                                      ExcelStyleConfig contentStyle,
                                      List<ExcelRangeConfig> rangeConfigList,
                                      String waterMarkContent) throws IOException {
        //导出数据
        ExcelDataUtil.exportSingletonSheet(response, null, fileName, sheetName, headList, dataList, headStyle, contentStyle, rangeConfigList, waterMarkContent);
    }


    /**
     * 导出 数据 ==> 单表
     * 返回输出流
     *
     * @param sheetName        导出sheet名
     * @param headList         表头
     * @param dataList         数据
     * @param headStyle        表头样式
     * @param contentStyle     内容样式
     * @param rangeConfigList  合并单元格样式
     * @param waterMarkContent 水印内容
     * @throws IOException
     */
    public static ByteArrayOutputStream exportFormData(String sheetName,
                                                       List<List<String>> headList,
                                                       List<List<String>> dataList,
                                                       ExcelStyleConfig headStyle,
                                                       ExcelStyleConfig contentStyle,
                                                       List<ExcelRangeConfig> rangeConfigList,
                                                       String waterMarkContent) throws IOException { // 创建 ByteArrayOutputStream
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        //导出数据
        ExcelDataUtil.exportSingletonSheet(null, outputStream, null, sheetName, headList, dataList, headStyle, contentStyle, rangeConfigList, waterMarkContent);
        return outputStream;
    }


    /**
     * 导出 数据 ==> 多表
     * 注意: 多表导出 可以单独设置每个表样式,如果需要可以传list 这边设置的所有sheet页 样式相同
     *
     * @param response
     * @param fileName         导出文件名
     * @param sheetName        导出sheet名 list
     * @param headList         表头 list
     * @param dataList         数据 list
     * @param headStyle        表头样式
     * @param contentStyle     内容样式
     * @param rangeConfigList  合并单元格样式
     * @param waterMarkContent 水印内容
     * @throws IOException
     */
    public static void exportFormData(HttpServletResponse response,
                                      String fileName,
                                      List<String> sheetName,
                                      List<List<List<String>>> headList,
                                      List<List<List<String>>> dataList,
                                      ExcelStyleConfig headStyle,
                                      ExcelStyleConfig contentStyle,
                                      List<ExcelRangeConfig> rangeConfigList,
                                      String waterMarkContent) throws IOException {
        //导出数据
        ExcelDataUtil.exportMultiSheet(response, null, fileName, sheetName, headList, dataList, headStyle, contentStyle, rangeConfigList, waterMarkContent);
    }


    /**
     * 导出 数据 ==> 多表
     * 注意: 多表导出 可以单独设置每个表样式,如果需要可以传list 这边设置的所有sheet页 样式相同
     *
     * @param fileName         导出文件名
     * @param sheetName        导出sheet名 list
     * @param headList         表头 list
     * @param dataList         数据 list
     * @param headStyle        表头样式
     * @param contentStyle     内容样式
     * @param rangeConfigList  合并单元格样式
     * @param waterMarkContent 水印内容
     * @throws IOException
     */
    public static ByteArrayOutputStream exportFormData(
                                      List<String> sheetName,
                                      List<List<List<String>>> headList,
                                      List<List<List<String>>> dataList,
                                      ExcelStyleConfig headStyle,
                                      ExcelStyleConfig contentStyle,
                                      List<ExcelRangeConfig> rangeConfigList,
                                      String waterMarkContent) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        //导出数据
        ExcelDataUtil.exportMultiSheet(null,outputStream,null, sheetName, headList, dataList, headStyle, contentStyle, rangeConfigList, waterMarkContent);
        return outputStream;
    }


    //################################# 导入 ########################################

    /**
     * 模板导入
     *
     * @param designId    设计表id
     * @param inputStream
     * @return
     */
    public static List<Map<Integer, Map<String, Object>>> importFormExcel(Long designId, InputStream inputStream) {

        return ExcelDataUtil.importFormExcel(designId, inputStream);

    }


}
